﻿using System;
using System.Collections.Generic;
//using System.Linq;
using System.Text;
using PUCLibrary;
using System.IO;
using System.Xml;

namespace WebRamosUCWebCrawler
{
    public class XMLWriter
    {
        /// <summary>
        /// Guarda todos los ramos en un XML.
        /// </summary>
        /// <param name="listaRamos">Ramos a guardar. Formato: ["sigla", "ramo"]</param>
        /// <param name="saveStream">Stream en donde se guarda. Puede ser FileStream, MemoryStream, etc.</param>
        public void Save(Dictionary<string, Ramo> listaRamos, Stream saveStream, string periodo)
        {

            XmlTextWriter xmlTextWriter = new XmlTextWriter(saveStream, Encoding.Default);

            xmlTextWriter.Formatting = Formatting.Indented;
            xmlTextWriter.WriteStartDocument();

            xmlTextWriter.WriteStartElement("WebRamosUC");
            xmlTextWriter.WriteAttributeString("Periodo", periodo);
            xmlTextWriter.WriteAttributeString("xmlns", "http://www.webramosuc.cl/schema");

            //Iteramos por cada ramo
            foreach (var ramos in listaRamos)
            {
                xmlTextWriter.WriteStartElement("Ramo");
                {
                    xmlTextWriter.WriteStartElement("Facultad");
                    xmlTextWriter.WriteString(ramos.Value.Carrera);
                    xmlTextWriter.WriteEndElement();

                    xmlTextWriter.WriteStartElement("Sigla");
                    xmlTextWriter.WriteString(ramos.Value.Sigla);
                    xmlTextWriter.WriteEndElement();

                    xmlTextWriter.WriteStartElement("Nombre");
                    xmlTextWriter.WriteString(ramos.Value.Nombre);
                    xmlTextWriter.WriteEndElement();

                    xmlTextWriter.WriteStartElement("Descripcion");
                    xmlTextWriter.WriteString(ramos.Value.Descripcion);
                    xmlTextWriter.WriteEndElement();

                    xmlTextWriter.WriteStartElement("Creditos");
                    xmlTextWriter.WriteValue(ramos.Value.Creditos);
                    xmlTextWriter.WriteEndElement();

                    xmlTextWriter.WriteStartElement("UrlPrograma");
                    xmlTextWriter.WriteValue(ramos.Value.UrlPrograma);
                    xmlTextWriter.WriteEndElement();

                    //Iteramos las secciones del Ramo:
                    foreach (Seccion seccion in ramos.Value.Secciones)
                    {
                        xmlTextWriter.WriteStartElement("Seccion");
                        {
                            xmlTextWriter.WriteAttributeString("NumSeccion", seccion.NumSeccion.ToString());

                            xmlTextWriter.WriteStartElement("Profesores");
                            foreach (string profesor in seccion.Profesor)
                            {
                                if (profesor != "(No informado)")   //Sacamos los profesores no validos.
                                {
                                    xmlTextWriter.WriteStartElement("NombreProfe");
                                    xmlTextWriter.WriteString(profesor);
                                    xmlTextWriter.WriteEndElement();
                                }
                            }
                            xmlTextWriter.WriteEndElement();
                            
                            xmlTextWriter.WriteStartElement("Campus");
                            xmlTextWriter.WriteString(seccion.Campus);
                            xmlTextWriter.WriteEndElement();

                            xmlTextWriter.WriteStartElement("Vacantes");
                            xmlTextWriter.WriteValue(seccion.NumVacantes);
                            xmlTextWriter.WriteEndElement();

                            //xmlTextWriter.WriteStartElement("Modulos");
                            //xmlTextWriter.WriteString(seccion.Horario.getModuloString());
                            //xmlTextWriter.WriteEndElement();

                            //xmlTextWriter.WriteStartElement("Salas");
                            //xmlTextWriter.WriteString(seccion.Horario.getSalaString());
                            //xmlTextWriter.WriteEndElement();

                            xmlTextWriter.WriteStartElement("Horario");
                            xmlTextWriter.WriteAttributeString("ModuloString", seccion.Horario.getModuloString());
                            xmlTextWriter.WriteAttributeString("SalaString", seccion.Horario.getSalaString());
                            {
                                foreach (Modulo mod in seccion.Horario.Modulos)
                                {
                                    xmlTextWriter.WriteStartElement("Modulo");
                                    {
                                        xmlTextWriter.WriteAttributeString("Dia", Enum.GetName(typeof(DayOfWeek), mod.DiaSemana));
                                        xmlTextWriter.WriteAttributeString("Mod", mod.ModuloNum.ToString());
                                        //Algunas salas pueden ser (Sin sala)/(Sin asignar)/(Por asignar), pero las dejamos igual.
                                        xmlTextWriter.WriteAttributeString("Sala", mod.ModuloSala);         
                                        xmlTextWriter.WriteAttributeString("TipoActividad", mod.TipoModulo);
                                    }
                                    xmlTextWriter.WriteEndElement();    //</Modulo>
                                }
                            }
                            xmlTextWriter.WriteEndElement();    //<Horario>

                            xmlTextWriter.WriteStartElement("Evaluaciones");
                            foreach (DateTime eval in seccion.Evaluaciones)
                            {
                                xmlTextWriter.WriteStartElement("Evaluacion");
                                xmlTextWriter.WriteAttributeString("Nombre", "Evaluacion");     //TODO: Ponerle un nombre decente a las evaluaciones
                                xmlTextWriter.WriteString(eval.ToString("s"));  //ISO-8601 time display: YYYY-MM-DDThh:mm:ss
                                xmlTextWriter.WriteEndElement();
                            }
                            xmlTextWriter.WriteEndElement();    //</Evaluaciones>
                        }
                        xmlTextWriter.WriteEndElement();    //</Seccion>
                    }

                }
                xmlTextWriter.WriteEndElement();    //</Ramo>
            }
            xmlTextWriter.WriteEndElement();    //</WebRamosUC>

            //Guardar y cerrar.
            xmlTextWriter.WriteEndDocument();
            xmlTextWriter.Flush();
            xmlTextWriter.Close();
        }
    }
}
